package com.iwhalecloud.bss.kite.cucc.service.attr.handler;

import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.constant.ServiceOfferConsts;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.common.util.StrTools;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.attr.handler.AbstractAttrHandler;
import com.ztesoft.bss.common.exception.BssException;

/**
 *ip地址校验:
 * 协议：tcp、udp、any，可以不填写，默认为any，可以直接是IP地址，也可以IP地址/掩码：
 * 端口号|协议，比如：112.80.4.186/32:80|tcp或者112.80.4.186 32:80 90|tcp
 * 或者112.80.4.186/32或者112.80.4.186/32:80，每条记录之间请使用英文分号';'隔开
 */
public class IPAddressAttrHandler extends AbstractAttrHandler<KiteInst, AttrData> {

    @Override
    public void onShow(KiteAttr attr, KiteInst inst, AttrData data) {
        String fieldName = attr.getFieldName();
        if (KiteStringUtils.equals(ServiceOfferConsts.SERVICE_OFFER_ORDER,data.getServiceOfferId())) {
            return;
        }
        if(KiteStringUtils.equalsAny(fieldName,"200004011","200004012")){
            String operType = inst.getAttrValue("200002753");
            if (KiteStringUtils.equals(operType, "100007392")) {
                attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_D);
                attr.setIsNull(KeyConsts.IFTRUE_T);
            }else {
                attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                attr.setIsNull(KeyConsts.IFTRUE_T);
            }
        }
    }
//    @Override
//    public void before(KiteAttr attr, KiteInst inst, String value, AttrData data) {
//        if(!KiteStringUtils.isEmpty(value)){
//            // 定制连接产品终端地址池(主)的地址格式取消校验, 通用连接产品：URL地址、IP地址格式校验均取消
//            if ((KiteStringUtils.equalsAny(inst.getSpecId(), "100000000016332", "100000000016333", "100000000016334", "100000000016335") && KiteStringUtils.equalsAny(attr.getFieldName(), "200001489")) ||
//                (KiteStringUtils.equalsAny(inst.getSpecId(), "30000015011", "30000015012", "300000150") && KiteStringUtils.equalsAny(attr.getFieldName(), "200004011", "200004012"))) {
//                return;
//            }
//            boolean check = true;
//            try {
//                if(StrTools.isIndexOf(value, ";", "")){
//                    String[] strs = value.split(";");
//                    for(String str : strs){
//                        check = checkIsIP(str);
//                        if(!check){
//                            break;
//                        }
//                    }
//                }else{
//                    check = checkIsIP(value);
//                }
//            }catch (Exception e){
//                check = false;
//            }
//            if(!check){
//                BssException.throwOut("ip地址校验","ip地址校验不通过，请检查","当前输入的ip地址为【"+value+"】,校验不通过，请检查，地址格式如下：112.80.4.186/32:80|tcp或112.80.4.186 32:80 90|tcp或112.80.4.186/32或112.80.4.186/32:80,多个IP地址请用英文格式;隔开");
//            }
//        }
//    }

    private boolean checkIsIP(String value){
        boolean check = true;
        if(StrTools.isIndexOf(value, "/", "")) {
            String[] arrs = value.split("/");
            check = checkIsIP(arrs);
        }
        else if(StrTools.isIndexOf(value, " ", "")){
            String[] arrs = value.split(" ");
            check = checkIsIP(arrs);
        }
        else {
            check = false;
        }
        return check;
    }

    private boolean checkIsIP(String[] arrs){
        String ip = arrs[0];
        boolean check = StrTools.isIP(ip);
        String str = arrs[1];
        if(check){
            String[] strs = str.split(":");
            //掩码
            String mask = strs[0];
            check = StrTools.isNum(mask);
            if (strs.length == 1) {
                //形如192.1.1.1/32
                return check;
            }
            if(check){
                /**到这里就是检查端口、协议,含有|字符的为有协议 strs[1]是 80|tcp **/
                if(StrTools.isIndexOf(strs[1], "|", "")){

                    /**形如192.1.1.3/32:80|tcp  arr是[80,tcp] **/
                    String[] arr = strs[1].split("\\|");

                    if(StrTools.isIndexOf(arr[0], " ", "")){
                        /**形如192.1.1.3/32:80 90|tcp 会进这里  portRange是[80,90] 校验端口为数字 **/
                        String[] portRange = arr[0].split(" ");
                        check = StrTools.isNum(portRange[0]) && portRange.length == 2 && StrTools.isNum(portRange[1]);
                    }
                    else {
                        /**形如192.1.1.3/32:80|tcp,校验端口为数字 **/
                        check = StrTools.isNum(arr[0]);
                    }
                    String tcp = arr[1];
                    if(check){
                        return KiteStringUtils.equalsAny(tcp,"tcp","udp","any");
                    }
                }else {
                    //没有协议,检查端口  含有空格的是端口范围,否则是单端口
                    if(StrTools.isIndexOf(strs[1], " ", "")){
                        //形如192.1.1.3/32:80 90
                        String[] portRange = strs[1].split(" ");
                        check = StrTools.isNum(portRange[0]) && portRange.length == 2 && StrTools.isNum(portRange[1]);
                    }
                    else {
                        //形如192.1.1.3/32:80
                        check = StrTools.isNum(strs[1]);
                    }
                }
            }
        }
        return check;
    }
}


